﻿using DesignModeConsole.行为型.观察者模式.EventBusSample;

namespace DesignModeConsole.行为型.观察者模式;

/// <summary>
/// 观察者模式
/// </summary>
public class ObserverService : IService
{
    public void Main()
    {
        // 常见的观察者模式实现方式(观察者中的“模板代码”)
        // var subject = new ConcreteSubject();
        // subject.RegisterObserver(new ConcreteObserverOne());
        // subject.RegisterObserver(new ConcreteObserverTwo());
        // subject.NotifyObservers(new Message());

        // 示例二：同步阻塞方案
        // var userController = new UserController();
        // // 这样子好处就是当需要新添加观察者的时候，只需要修改RegObserver接口的类并且注册到UserController即可
        // userController.SetRegObservers(new List<RegObserver>() { new SendEmailObserver(), new SendSmsObserver() });
        // userController.Register("张三");

        // 示例二：异步非阻塞方案  通过线程池开启新线程
        // var userController2 = new UserController2();
        // // 这样子好处就是当需要新添加观察者的时候，只需要修改RegObserver接口的类并且注册到UserController即可
        // userController2.SetRegObservers(new List<RegObserver>() { new SendEmailObserver(), new SendSmsObserver() });
        // userController2.Register("张三");

        // 示例：EventBus 事件总线  
        // 大致逻辑：在项目启动的时候将注册的参数类型以及对应的处理程序进行注册，然后执行的时候根据参数类型名去获取处理程序然后反射生成处理程序然后执行
        var eventBus = new EventBus();
        eventBus.Trigger(new TestEventData() { EventSource = "张三" });
    }
}